﻿
#include <stdio.h>

#include "testBkDev.h"
#include "testChar.h"
#include "flash.h"
#include "testFlashBkDev.h"

#include "debug.h"
#include "io.h"
#include "sampleFsImpl.h"
#include "xFs.h"
#include "sampleFS.h"
#include "printfIn.h"
#include "ufs.h"
#include "mem.h"

#include "OSShellPort.h"


#include <windows.h>
#include <string.h>

int32_t FileTest(const char *fileName) {
	int32_t fp;
	int32_t rwLen;
	if ((fp = SysOpen(fileName, F_CREATE)) < 0) {
		printf("文件打开失败\r\n");
		return - 1;
	}
	char data[4096*5] = "1234";
	for (uint32_t i = 0; i < sizeof(data); i++) {
		data[i] = i%128;
	}
	if ((rwLen=SysWrite(fp, data, sizeof(data))) < 0) {
		printf("文件写入失败\r\n");
	}
	SysSeek(fp, 0, 0);
	memset(data, 0, sizeof(data));
	if ((rwLen=SysRead(fp, data, sizeof(data))) < 0) {
		printf("文件读取失败\r\n");
	}
	for (uint32_t i = 0; i < sizeof(data); i++) {
		if (data[i] != i%128) {
			printf("文件读写测试失败\r\n");
			break;
		}
	}
	if (SysClose(fp) < 0) {
		printf("文件关闭失败\r\n");
	}
	return 0;
}
void devTest(void) {
	int32_t fp;
	int32_t rwLen;
	if ((fp = SysOpen("/dev/testChar", F_RONLY)) < 0) {
		printf("驱动打开失败\r\n");
		return;
	}
	char data[4096] = "1234";
	for (uint32_t i = 0; i < sizeof(data); i++) {
		data[i] = i % 128;
	}
	if ((rwLen = SysWrite(fp, data, sizeof(data))) < 0) {
		printf("驱动写入失败\r\n");
	}
	SysSeek(fp, 0, 0);
	memset(data, 0, sizeof(data));
	if ((rwLen = SysRead(fp, data, sizeof(data))) < 0) {
		printf("驱动读取失败\r\n");
	}
	if (SysClose(fp) < 0) {
		printf("驱动关闭失败\r\n");
	}
}

int main()
{
	printf("INode Size :%d",sizeof(Inode));
	printf("DirItem Size :%d",sizeof(DirItem));
	//内存初始化
	InitMem();
	TestFlashBkDevInit();
	//文件系统初始化
	sampleFSInit();
	xFSInit();
#if 1
	//创建文件系统
	if (CreateFS(rootDevID, ROOT_FILE_TYPE_NAME) < 0) {
		kprintf("致命错误，文件系统创建失败\r\n");
		while (1);
	}
#endif
	//挂载根文件系统
	if (MountRoot(rootDevID,ROOT_FILE_TYPE_NAME) < 0) {
		printf("挂载失败，致命错误\r\n");
		while (1);
	}
	//串口输出设备
	TestDevInit();
	//printf初始化
	PrintfInit();

	//驱动初始化
	FlashDevInit();
	TestBkDevInit();
	
#if 0
	if (CreateFsByDevPath("/dev/flash", "sampleFS") < 0) {
		printf("格式化失败");
	}
#endif
	SysMkdir("/", "mnt");
	if (SysMount("/dev/flash", "/mnt", "sampleFS") < 0) {
		printf("挂载失败");
	}

#if 0
	int save_fd = dup(STD_OUT_FD); // 保存标准输出 文件描述符 注:这里一定要用 dup 复制一个文件描述符. 不要用 = 就像是Winodws下的句柄.  
	int fd = SysOpen("/mnt/test1.txt", F_CREATE);
	dup2(fd, STD_OUT_FD); // 用我们新打开的文件描述符替换掉 标准输出  
	kprintf("test file1\r\n");
	kprintf("test file2\r\n");
	kprintf("test file3\r\n");
	dup2(save_fd, STD_OUT_FD);
#endif 

#if 0 
	DWORD s = GetTickCount();
	for (int j = 0; j < 1; j++) {
		for (int i = 0; i < 4; i++) {
			char data[32];
			sprintf(data, "/test%d", i);
			printf("创建文件，%s\r\n", data);
			if (FileTest(data) < 0) {
				goto end;
			}

		}
		printf("剩余内存:%d\r\n", GetFreeMemory(0));
		/*for (int i = 0; i < 1; i++) {
			char data[32];
			sprintf(data, "/test%d", i);
			printf("删除文件，%s\r\n", data);
			if (SysUnlink(data) < 0) {
				printf("文件删除失败\r\n");
				goto end;
			}
		}
		printf("剩余内存:%d\r\n", GetFreeMemory(0));*/
	}
	printf("\r\n使用了%dMs\r\n", GetTickCount()-s);
	//for (int i = 0; i < 40; i++) {
	//	char data[32];
	//	sprintf(data, "/test%d", i);
	//	printf("创建文件，%s", data);
	//	FileTest(data);

	//}
end:
	//devTest();
#endif
	//printf("\r\n");
	//PrintFileInDir(FsFindByDevNo(rootDevID), "/");
	//
	//printf("\r\n");
	//PrintFileInDir(FsFindByDevNo(rootDevID), "/");
	//printf("\r\n");
	//PrintFileInDir(FsFindByDevNo(rootDevID), "/dev");


	//SysMkdir("/mnt", "zz");
	PrintFileInDir(FsFindByDevNo(rootDevID), "/mnt");
	//printf("\r\n");
	//PrintFileInDir(FsFindByDevNo(rootDevID), "/mnt/zz");
	//SysMkdir("/mnt/zz", "1");
	//printf("\r\n");
	//PrintFileInDir(FsFindByDevNo(rootDevID), "/mnt/zz");
	
	UserOSShellInit();
	return 0;
}
